package cliente;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

/**
 * Clase para la lectura de los archivos xml
 * 
 * @author Jesús Vásquez
 */
public class lecturaArchivo {

    XStream xs = new XStream(new DomDriver());
    
    /**
     * Leemos el archivo con la lista de usuarios
     * 
     * @return la lista de los usuarios
     */
    public List<Persona> LeerListaUsuario()
    {        
        List<Persona> personas = new ArrayList<Persona>();
        try {
            FileInputStream fis = new FileInputStream(System.getProperty("user.dir")+"/Usuarios.xml");
            //xs.fromXML(fis, personas);
            personas = (List<Persona>)xs.fromXML(fis);
            return personas;
            //print the data from the object that has been read
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }
        return null;
    };

    /**
     * Buscamos un usuario en específico dentro de la lista
     * 
     * @param Usuario el usuario a buscar
     * @return el usuario encontrado
     */
    public Persona BuscaUsuario(Persona Usuario)//devuelve null si no existe
    {
        List<Persona> listPersona = new ArrayList<Persona>();
        try {
            FileInputStream fis = new FileInputStream(System.getProperty("user.dir") + "/Usuarios.xml");
            //xs.fromXML(fis, personas);
            listPersona = (List<Persona>) xs.fromXML(fis);
            int cant = listPersona.size();
            for (int i = 0; i < cant; i++) {
                if (Usuario.getNombre().equals(listPersona.get(i).getNombre())) {
                    return Usuario;
                }
            }
            return null;
            //print the data from the object that has been read
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }
        return null;
    }

    /**
     * Leemos la lista de archivos de un documento xml
     * 
     * @param usuario el usuario que tiene asociado los archivos
     * @return la lista de archivos
     */
    public List<Archivo> LeerArchivosUsuario(Persona usuario) {
        List<Archivo> archivos = new ArrayList<Archivo>();
        try {
            FileInputStream fis = new FileInputStream(System.getProperty("user.dir") + "/archivos/" + usuario.getNombre() + "/ArchivosUsuario.xml");
            //xs.fromXML(fis, personas);
            archivos = (List<Archivo>) xs.fromXML(fis);
            return archivos;
            //print the data from the object that has been read
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }
        return null;
    }

    /**
     * Leemos los archivos del repositorio de datos
     * 
     * @param nombre nomde del archivo
     * @return lista de los archivos que se encuentran en el repositorio
     * @throws IOException arroja una excepcion de entrada/salida de datos
     */
    public List<String> LeerArchivosRepositorio(String nombre) throws IOException{
        List<String> listArchivoUsuario = new ArrayList<String>();
        
        //File directorio = new File(System.getProperty("user.dir") + "/tmp/" + nombre);
        //directorio.mkdirs();
        
        try {
            File archivo = new File (System.getProperty("user.dir") + "/tmp/"+nombre+"/Archivos.xml");
            FileReader fr = new FileReader (archivo);
            BufferedReader br = new BufferedReader(fr);
            String linea;
            while(1==1){ 
             linea = br.readLine();
             if (linea != null){
                System.out.println(linea);
                if (linea.contains("<Nombre>")){
                    StringTokenizer tokens = new StringTokenizer(linea,"<>");
                    String respuesta = tokens.nextToken();
                    respuesta = tokens.nextToken();
                    listArchivoUsuario.add(respuesta = tokens.nextToken()); 
                }
             }else{
                 break;
             }
            }
           
            return listArchivoUsuario;
            //print the data from the object that has been read
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }
        return null;
    }
    
    /**
     * Buscar la ruta de los archivos de un usuario
     * 
     * @param NombreUsuario nombre del usuario
     * @return ruta del archivo a descargar
     */
    public String BuscaRutaUsuario(String NombreUsuario) {
        List<Persona> listPersona = new ArrayList<Persona>();
        try {
            FileInputStream fis = new FileInputStream(System.getProperty("user.dir") + "/Usuarios.xml");
            //xs.fromXML(fis, personas);
            listPersona = (List<Persona>) xs.fromXML(fis);
            int cant = listPersona.size();
            for (int i = 0; i < cant; i++) {
                if (NombreUsuario.equals(listPersona.get(i).getNombre())) {
                    return listPersona.get(i).getLista_archivo();
                }
            }
            return null;
            //print the data from the object that has been read
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }
        return null;
    }
    
    /**
     * Leemos el archivo de configuración del cliente
     * 
     * @return la lista de las direcciones IP disponibles para conexión
     */
     public List<Configuracion> LeerArchivoConfiguracion() {
        List<Configuracion> configuracion = new ArrayList<Configuracion>();
        try {
            FileInputStream fis = new FileInputStream("Config.xml");
            //xs.fromXML(fis, personas);
            configuracion = (List<Configuracion>) xs.fromXML(fis);
            return configuracion;
            //print the data from the object that has been read
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }
        return null;
    }
}